iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Security

我逆向你逆向我的逆向工程膩系列 第 3

Dx03 - “Hello World!”

  • 分享至 

  • xImage
  •  

還記得第一次學習程式的時候,輸入 ”Hello world!” 的回憶嗎 ? 在逆向工程中雖沒辦法創造,但是可以透過分析來找回這份 ( 痛苦的 ) 記憶。

找尋 Hello World

範例程式

https://github.com/Dinlon5566/IT_Reverse_Engineering/blob/main/Dx03/HelloWorld_x64.exe

今天要使用上一篇的程式作為動態分析的範例,並使用 x64dbg 來進行操作。

https://ithelp.ithome.com.tw/upload/images/20220917/20135675KotiH63TUy.png

當我們利用 x64dbg 開啟程式後,就可以看到很多指令在銀幕上。這時候按一下運行 ( F9 ) 就會到程式的入口點 ( Entry point ),但這裡還不是顯示 Hello world 的地方。在程式運行時還有許多動作,而我們的目標是要找到 main 函式。

熟悉以下幾個指令的快捷鍵 :

  • Restart ( ctrl+F2 ) 重新開始 debug
  • Step into ( F7 ) 執行指令並進入 ( 遇到 CALL進去 )
  • Step over ( F8 ) 執行指令不進入 ( 遇到 CALL直接做完 )
  • Execute ( F9 ) 執行直到中斷點或結束
  • Execute till return ( ctrl + F9 ) 執行直到遇到 RET 指令

透過反編譯器可以看到進入點的位置 : VA = 7FF601EA12C0。這是裝載時的記憶體位置,每次都可能不一樣。而相對的程式起點 RVA = 000012C0 都會固定

https://ithelp.ithome.com.tw/upload/images/20220917/20135675qxHz4MtSii.png

sub add 這兩個是給堆疊放出空間,可以忽略。

call 7FF601EA16A0調用這個位置的函數 ( 16A0 )

jmp 7FF602EA1144 — 把位置跳到這個位置 ( 1144 )

現在透過 F8 把執行位置移動到 call ,並且使用 F7 進入這段函式。就可以看到很多指令,不過 main 不在這裡,所以使用 ctrl+F9 跳到 RETN,並 F8 回到 12C9。

然後使用 F8 執行 jmp 指令後就會跳到目標位置 :

https://ithelp.ithome.com.tw/upload/images/20220917/20135675MFzEBMuTHx.png

看起來很複雜,不過現在不用理解沒關係。這些是 VC++ 啟動函數,不同開發工具的啟動函數也不同。現在來找尋 main 函數,方法就是進入每一個 call,看看裡面有沒有 MessageBox API ,若沒有就 ctrl+F9 到 RET 後在回到上一層。要是搞混了也可以 ctrl+F2 重來。

找到後可以看到位置在 1000,正是 main 的起始位置。

https://ithelp.ithome.com.tw/upload/images/20220917/20135675oqII9CF1MB.png

利用 F8 執行至 101D 位置,可以看到字串被載入還有 MsgBox 彈出

https://ithelp.ithome.com.tw/upload/images/20220917/20135675S4I4uog36e.png

很好,成功了。但每次都要從起點到目標或許花了太多時間,這邊介紹幾個比較快的方法 :

  1. Goto ( ctrl+G ) : 直接輸入目標位置後按確定,就會選到目標位置。此時使用 F4 就會執行到該處。
  2. 中斷點 ( F2 ) : 透過設置 Break Point 的方式可以讓執行時碰到該點就自動暫停。
  3. 註解 ( ; ) : 可以顯示在右邊讓你閱讀該項目的筆記。
  4. 標籤 ( : ) : 可以透過新增標籤到特定位置上,讓其他地方跳來這邊時可以顯示該位置的標籤。
    下圖為把位置 1000 標示了 main function

https://ithelp.ithome.com.tw/upload/images/20220917/20135675colB0iJYdo.png

Patch

既然我們已經找到了主函式的位置,代表可以監看與修改暫存器與檔案內容。透過查看原本的暫存器位置可以看到 "Hello world” 引用存在 RDX,其值為字串存放位置。

https://ithelp.ithome.com.tw/upload/images/20220917/20135675KC3FkptgHu.png

複製該位置,在左下角資料視窗使用 ctrl+G 跳到該字串存放位置,在字元區選擇目標字串。這時候會發現字串是 "H . e . l . l . o ” 這樣,這是因為這裡使用了 Unicode 而不是 ascii。

https://ithelp.ithome.com.tw/upload/images/20220917/20135675e65Wn4vizU.png

選取要修改的位置,並且按下 ctrl+E 編輯資料。就可以於 Unicode 中改成你想要的文字,但最好不要超過原長度。

https://ithelp.ithome.com.tw/upload/images/20220917/20135675JW0H2iTqhM.png

執行後就會發現變成你修改的文字

https://ithelp.ithome.com.tw/upload/images/20220917/20135675UmLLQfDy3o.png

若是直接將儲存指令或資料的位置進行更改,也就會形成 Patch (補丁)了
https://ithelp.ithome.com.tw/upload/images/20220918/20135675zIyODkV7Mj.png

小實驗

https://github.com/Dinlon5566/IT_Reverse_Engineering/blob/main/Dx03/D02_tryHackme.exe

請透過 x64dbg 查出目標密碼。


上一篇
Dx02 - 初探逆向工程
下一篇
Dx04 - 基礎組語觀念
系列文
我逆向你逆向我的逆向工程膩31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
HoiDam
iT邦新手 5 級 ‧ 2022-12-29 16:23:43

ZA WAAAAAAAAAAAAAARUDOOOOOOOOO

我要留言

立即登入留言